// function Food() {
//   console.log('foooooooooooooooood')
//   this.type = 'food'
// }

// Food.prototype.getType = function () {
//   console.log(this, '11111111111')
//   return this.type
// }

// function Vegetables(name) {
//   Food.call(this)
//   this.name = name
// }

// Vegetables.prototype = new Food()
// Vegetables.prototype.constructor = Vegetables
// const tomato = new Vegetables('tomato')
// console.log(tomato)

// class Parnet {
//   constructor(name) {
//     this.name = name
//   }
//   getName() {
//     return this.name
//   }
//   static getParentName() {
//     return this
//   }
// }

// class Child extends Parnet {
//   constructor(name, age) {
//     super(name)
//     this.age = age
//   }
// }

// const child = new Child('嘿嘿', 2222)

// console.log(child)
// console.log(child.getName())
// console.log(Child.getParentName())
// 获取构造函数的原型对象
// console.log(Object.getPrototypeOf(Child))

// super作为函数使使用

// 在普通方法中 => 父类的原型对象
// 在静态方法中 => 父类

// class Parent {
//   constructor() {
//     this.type = 'parent'
//     console.log(this, '1111111')
//   }
//   getName() {
//     console.log(this, '22222222')
//     return this.type
//   }
// }

// Parent.getType = () => {
//   console.log(this, '3333333')
//   return 'is parent'
// }

// class Child extends Parent {
//   constructor() {
//     super()
//     console.log('constructor:' + super.getName())
//   }
//   getParentName() {
//     console.log('getParentName:' + super.getName())
//   }
//   static getParentType() {
//     console.log('getParentType' + '  ' + super.getType())
//   }
// }

// const child = new Child()
// child.getParentName()
// Child.getParentType()

// class Parent {
//   constructor(name) {
//     this.name = name
//   }
//   print() {
//     console.log(this.name)
//   }
// }

// class Child extends Parent {
//   constructor(name) {
//     super(name)
//     this.age = '18'
//   }

//   childPrint() {
//     super.print()
//   }
// }
// const c = new Child('哈')
// console.log(c)
// c.childPrint()

// prototype
// __proto__

// var objs = new Object()
// console.log(objs.__proto__ === Object.prototype)

// 子类的__proto__指向父类的本身
// 子类的prototype属性的__proto__指向父类的protype属性
// 实例的__proto__属性的__proto__指向父类实例的__proto__

// class Person {}

// console.log(Person instanceof Object)

// class CustomArray extends Array {
//   constructor(...arg) {
//     super(...arg)
//   }
// }

// const arr = new CustomArray(1, 2, 3, 4)

// console.log(arr)

// ES5
// 先创建子构造函数实例的this
// 然后再将子构造函数的属性和方法添加到构造函数身上
// 1. 创建一个空对象 this指向构造函数的原型
// 2. 通过this添加属性和方法
// 3. 返回这个this并让他指向new出来的实例

// Es6
// Es6的类先取到实例对象this，然后调用super函数之后，再将这个实例的属性和方法加到这个实例身上

// class Parent {
//   name = '胭脂'
//   constructor(age) {
//     this.age = age
//   }
// }

// class Child extends Parent {
//   constructor(age) {
//     super(age)
//   }
// }

// const child = new Child(19)
// console.log(child)

// class Person {
//   constructor() {
//     this.name = '胭脂'
//   }
// }

// class Child extends Person {
//   constructor() {
//     super()
//   }
// }

// console.log(Child.__proto__)
